
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dataBase;

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author ivanpianetti
 */
public class ConexionPostgre {

    private static final Connection connectionFactory;
    private static String DRIVER_DB = "org.postgresql.Driver";
//    DataBase de Ivan Pianetti
    private static String URL_DB = "jdbc:postgresql://localhost:5432/PandoraBox";
    private static String USUARIO_DB = "postgres";
    private static String CLAVE_DB = "bipiane";
    
    static {
        try {
            connectionFactory = ConexionPostgre.getConexion();
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static void main(String[] argv) {
        ConexionPostgre.runTest();
    }

    private static void runTest() {
        System.out.println("Chequeando si el DRIVER esta cargado.");
        try {
            Class.forName(DRIVER_DB);
        } catch (ClassNotFoundException cnfe) {
            System.out.println("No se ha podido encontrar el DRIVER! Compruebe que se encuantra cargada la libreria");
            System.out.println("Listado de stack trace y fin de la conexion.");
            System.exit(1);
        }
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(URL_DB, USUARIO_DB, CLAVE_DB);
            conn = ConexionPostgre.getConexion();
        } catch (SQLException se) {
            System.out.println("No se ha podido hacer la conexion: Usuario, Contraseña o URL invalidos.");
            System.exit(1);
        }
        if (conn != null) {
            System.out.println("Conexion a la DB EXITOSA!");
            try {
                ConexionPostgre.cerrarConexion();
                System.out.println("Conexion cerrada exitosamente");
            } catch (SQLException ex) {
                System.out.println("No fue posible cerrar la conexion.");
                System.exit(1);
            }
        }
    }

    /**
     * El siguiente metodo obtiene y devuelve una nueva conexion.
     * @return Connection, corresponde a la conexion obtenida.
     * @throws java.sql.SQLException
     * @author ivanpianetti
     */
    private static Connection getConexion() throws SQLException {
        try {
            Class.forName(DRIVER_DB);
        } catch (ClassNotFoundException ex) {
        }
        Connection conne = DriverManager.getConnection(URL_DB, USUARIO_DB, CLAVE_DB);
        return conne;
    }

    public static Connection getConnectionFactory() {
        ConexionPostgre.restartSecuenciales();
        return connectionFactory;
    }

    /**
     * El metodo a continuacion cierra una determinada conexion.
     * @param conn tipo Connection, corresponde a la conexion a cerrar.
     * @throws java.sql.SQLException
     * @author ivanpianetti
     */
    public static void cerrarConexion() throws SQLException {
        connectionFactory.close();
    }

    /**
     * Este metodo se encarga de resetear el serial de los ID secuenciales
     * para que los próximos ID sean seguidos de los anteriores
     */
    private static void restartSecuenciales() {
        try {
            connectionFactory.createStatement().execute("SELECT restart_sequences()");
        } catch (SQLException ex) {
        }
    }

    /**
     * Se encarga de obtener el secuencial de una tabla.
     * Siempre retorna el ID siguiente al que se encuentra en la tabla 
     * @param tabla
     * @return 
     */
    public static Integer getSecuencialTable(String tabla) {
        int max = -1;
        try {
            Connection conn = ConexionPostgre.getConnectionFactory();
            PreparedStatement prepST = conn.prepareStatement("SELECT sequence_table(?)");

            prepST.setString(1, tabla);
            ResultSet rSet = prepST.executeQuery();
            if (rSet.next()) {
                max = rSet.getInt("sequence_table");
            }
        } catch (SQLException ex) {
        }
        return max;
    }
}
